/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import database.DBConnection;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.PropertiesManager;

/**
 *
 * @author Karen Aplica o padrão singleton, que deve ser criado conforme as
 * regras: - transformar o construtor em private - criar uma variavel do tipo da
 * propria classe como static - criar um método estático e publio que testa se
 * já existe uma instancia da classe
 */
public class UsuarioDAO implements OperacoesDAO {

    private Connection conexao;

    public UsuarioDAO() throws ClassNotFoundException, SQLException {        
            conexao = DBConnection.getConnection();   

    }
   @Override
    public void inserir(Object obj)throws SQLException {
        String SQL = buscaSQL("insert.Usuario");
        if (obj instanceof Usuario) {
            Usuario user = (Usuario) obj;
            PreparedStatement st = conexao.prepareStatement(SQL);
            st.setString(1, user.getLogin());
            st.setString(2, user.getSenha());
            st.setInt(3, user.getProfissional().getIdPessoa());
            st.setInt(4, user.getTipoUsuario().getIdTipo());
            st.execute();
        }
    }

    @Override
    public boolean excluir(Object obj) throws SQLException {
        Integer num = (Integer) obj;
        int id = num.intValue();
        String sql = (String) buscaSQL("delete.Usuario");
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setInt(1, id);
        stmt.execute();
        stmt.close();
        return true;
    }

    @Override
    public void editar(Object obj) throws SQLException {
        Usuario usu = (Usuario) obj;
        String sql = (String) buscaSQL("Update.Usuario");
        PreparedStatement stmt = conexao.prepareStatement(sql);
        stmt.setString(1, usu.getLogin());
        stmt.setString(2, usu.getSenha());
        stmt.setInt(3, usu.getProfissional().getPessoa().getIdPessoa());
        stmt.setInt(4, usu.getTipoUsuario().getIdTipo());
        stmt.setInt(5, usu.getIdUsuario());
        stmt.execute();
        stmt.close();
    }
    
     public Usuario pesquisarLogin(String chave) throws SQLException {
        Usuario user = null;
        String SQL = buscaSQL("selectByLogin.Usuario");
        PreparedStatement st = conexao.prepareStatement(SQL);
        st.setString(1, chave);
        ResultSet res = st.executeQuery();
        while (res.next()) {
            int idUsuario = res.getInt(1);
            String login = res.getString(2);
            String senha = res.getString(3);
            int idProfissional = res.getInt(4);
            int tipo = res.getInt(5);
            String nome = res.getString(6);
            String permissao = res.getString(7);
            Pessoa pes  = new Pessoa(idProfissional, null, null, null, null, null, null, null, null);
            Profissional prof  = new Profissional(pes, 0, null, 0, null,null, null, null, null, null, null, null, null, null, null);
            TipoUsuario tipousu  = new TipoUsuario(tipo, nome, permissao);
            user = new Usuario(idUsuario, prof, login, senha, tipousu);
        }
        return user;
    }
     
     
     public Usuario pesquisarById(String chave) throws SQLException {
        Usuario user = null;
        String SQL = buscaSQL("selectByID.Usuario");
        PreparedStatement st = conexao.prepareStatement(SQL);
        st.setString(1, chave);
        ResultSet res = st.executeQuery();
        while (res.next()) {
            int idUsuario = res.getInt(1);
            String login = res.getString(2);
            String senha = res.getString(3);
            int idProfissional = res.getInt(4);
            int tipo = res.getInt(5);
            Pessoa pes  = new Pessoa(idProfissional, null, null, null, null, null, null, null, null);
            Profissional prof  = new Profissional(pes, 0, null, 0, null,null, null, null, null, null, null, null, null, null, null);
            TipoUsuario tipousu  = new TipoUsuario(tipo, null, null);
            user = new Usuario(idUsuario, prof, login, senha, tipousu);
        }
        return user;
    }

    private String buscaSQL(String chave) {
        String sql = null;
        try {
            PropertiesManager pm = new PropertiesManager("sql.properties");
            HashMap dados = pm.readPropertiesFile();
            sql = (String) dados.get(chave);
        } catch (IOException ex) {
            Logger.getLogger(UsuarioDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return sql;
    }

   public ArrayList pesquisar() throws SQLException {
        ArrayList retorno = new ArrayList();
        String SQL = buscaSQL("selectPesquisaUsuario");
        Statement st = conexao.createStatement();
        ResultSet res = st.executeQuery(SQL);
        while (res.next()) {
            int key = res.getInt(1);
            String login = res.getString(2);
            String senha= res.getString(3);
            int profissional = res.getInt(4);
            int tipo = res.getInt(5);
            String nometipo = res.getString(6);
            Pessoa pes = new Pessoa(profissional, null, null, null, null, null, null, null, null);
            Profissional prof = new Profissional(pes, 0, null, 0, null, null, null, null, null, null, null, null, null, null, null);
            TipoUsuario tipousu = new TipoUsuario(tipo, nometipo, null);
            Usuario usu = new Usuario(key, prof, login, senha, tipousu);
            retorno.add(usu);
        }
        return retorno;
    }

}
